package com.yun.datastructure.map.hashmap.leetcode;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

public class Leetcode49 {
    /*
        1.返回字符串分组，所以s不用拆开
        2.将字符串直接存入哈希表中，值对应List中的位置
     */
    /*
        思路
        1.遍历字符串数组，每个字符串中的字符重新排序后作为key ****
        2.所谓分组，其实就是准备一个集合，把这些单词加入到key相同的集合中
        3.返回分组结果
     */
    public List<List<String>> groupAnagrams1(String[] strs) {
        List<List<String>> res=new ArrayList<>();
        HashMap<String,List<String>> map=new HashMap<>();
        for (String str : strs) {
            char[] chars = str.toCharArray();
            Arrays.sort(chars);
            String key=new String(chars);
            List<String> list = map.computeIfAbsent(key, k -> new ArrayList<>());
            list.add(str);
        }
        return new ArrayList<>(map.values());
    }

    static class ArrayKey{
        int[] key=new int[26];

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            ArrayKey arrayKey = (ArrayKey) o;
            return Arrays.equals(key, arrayKey.key);
        }

        @Override
        public int hashCode() {
            return Arrays.hashCode(key);
        }

        public ArrayKey(String str) {
            for (int i=0;i<str.length();i++){
                char ch=str.charAt(i);
                key[ch-97]++;
            }
        }
    }

    public List<List<String>> groupAnagrams(String[] strs){
        HashMap<ArrayKey,List<String>> map=new HashMap<>();
        for (String str : strs) {
            ArrayKey key = new ArrayKey(str);
            List<String> list=map.computeIfAbsent(key,k->new ArrayList<>());
            list.add(str);
        }
        return new ArrayList<>(map.values());
    }
}
